package com.example.redislearning.service;

import com.example.redislearning.entity.Course;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.List;
import java.util.Map;

/**
 * 课程管理服务接口
 * 包含课程查询、搜索、评分管理、销量统计等功能
 */
public interface CourseService {

    /**
     * 创建课程
     */
    Course createCourse(Course course);

    /**
     * 更新课程信息
     */
    Course updateCourse(Course course);

    /**
     * 删除课程
     */
    boolean deleteCourse(Integer courseId);

    /**
     * 根据ID查询课程详情（带Redis缓存）
     */
    Course getCourseById(Integer courseId);

    /**
     * 分页查询课程列表（带Redis缓存）
     */
    Page<Course> getCourseList(Pageable pageable);

    /**
     * 搜索课程（支持按标题、分类、难度筛选）
     */
    Page<Course> searchCourses(String keyword, String category, String difficulty, Pageable pageable);

    /**
     * 更新课程评分（原子操作）
     */
    Double updateCourseRating(Integer courseId, Double newRating);

    /**
     * 增加课程销量（Redis计数器）
     */
    Integer incrementCourseSales(Integer courseId, Integer increment);

    /**
     * 获取课程销量
     */
    Integer getCourseSales(Integer courseId);

    /**
     * 获取热门课程排行榜（Redis ZSet）
     */
    List<Map<String, Object>> getPopularCourses(int limit);

    /**
     * 获取推荐课程
     */
    List<Course> getRecommendedCourses(Integer userId, int limit);

    /**
     * 按分类获取课程
     */
    Page<Course> getCoursesByCategory(Integer categoryId, Pageable pageable);

    /**
     * 获取课程统计信息
     */
    Map<String, Object> getCourseStatistics(Integer courseId);

    /**
     * 检查课程是否存在
     */
    boolean isCourseExists(Integer courseId);

    /**
     * 批量获取课程信息
     */
    List<Course> getCoursesByIds(List<Integer> courseIds);

    boolean incrementViews(Integer courseId);

    boolean incrementSales(Integer courseId, Integer quantity);

    boolean updateRating(Integer courseId, Double newRating, Integer ratingCount);

    List<Course> getHotCourses(int limit);

    List<Course> getTopRatedCourses(int limit);

    List<Course> getTopSellingCourses(int limit);

    List<Course> getMostViewedCourses(int limit);

    /**
     * 获取最新课程
     */
    List<Course> getLatestCourses(int limit);

    /**
     * 获取免费课程
     */
    List<Course> getFreeCourses(int page, int size);

    /**
     * 根据价格区间获取课程
     */
    List<Course> getCoursesByPriceRange(Double minPrice, Double maxPrice, int page, int size);
}

